package com.sendi.system.util.common;
import java.sql.Timestamp;    
import java.text.ParseException;    
import java.text.SimpleDateFormat;    
import java.util.Calendar;    
import java.util.Date;    
import java.util.GregorianCalendar;        
   
public class DateUtil {    
    /**   
     * getDateStr get a string with format YYYY-MM-DD from a Date object   
     *    
     * @param date   
     *            date   
     * @return String   
     */   
    static public String getDateStr(Date date) {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        return format.format(date);    
    }    
       
    static public String getYear(Date date) {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy");    
        return format.format(date);    
    }    
    static public String getDateStrC(Date date) {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");    
        return format.format(date);    
    }    
   
    static public String getDateStrCompact(Date date) {    
        if (date == null)    
            return "";    
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd");    
        String str = format.format(date);    
        return str;    
    }    
   
    /**   
     * getDateStr get a string with format YYYY-MM-DD HH:mm:ss from a Date   
     * object   
     *    
     * @param date   
     *            date   
     * @return String   
     */   
    static public String getDateTimeStr(Date date) {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
        return format.format(date);    
    }    
   
    static public String getDateTimeStrC(Date date) {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");    
        return format.format(date);    
    }    
   
    public static String getCurDateStr(String pattern) {    
        SimpleDateFormat format = new SimpleDateFormat(pattern);    
        return format.format(new Date());    
    }    
   
    /**   
     * Parses text in 'YYYY-MM-DD' format to produce a date.   
     *    
     * @param s   
     *            the text   
     * @return Date   
     * @throws ParseException   
     */   
    static public Date parseDate(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        return format.parse(s);    
    }    
   
    static public Date parseDateC(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");    
        return format.parse(s);    
    }    
   
    /**   
     * Parses text in 'YYYY-MM-DD' format to produce a date.   
     *    
     * @param s   
     *            the text   
     * @return Date   
     * @throws ParseException   
     */   
    static public Date parseDateTime(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");    
        return format.parse(s);    
    }    
        
    static public Date parseDateTimeC(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");    
        return format.parse(s);    
    }    
   
    /**   
     * Parses text in 'HH:mm:ss' format to produce a time.   
     *    
     * @param s   
     *            the text   
     * @return Date   
     * @throws ParseException   
     */   
    static public Date parseTime(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");    
        return format.parse(s);    
    }    
   
    static public Date parseTimeC(String s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("HH时mm分ss秒");    
        return format.parse(s);    
    }    
   
    static public int yearOfDate(Date s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        String d = format.format(s);    
        return Integer.parseInt(d.substring(0, 4));    
    }    
   
    static public int monthOfDate(Date s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        String d = format.format(s);    
        return Integer.parseInt(d.substring(5, 7));    
    }    
   
    static public int dayOfDate(Date s) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        String d = format.format(s);    
        return Integer.parseInt(d.substring(8, 10));    
    }
    
    static public String getDateTime(Date s){    
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");    
        return format.format(s);    
    }
   
    static public String getDateTimeStr(java.sql.Date date, double time) {    
        int year = date.getYear() + 1900;    
        int month = date.getMonth() + 1;    
        int day = date.getDate();    
        String dateStr = year + "-" + month + "-" + day;    
        Double d = new Double(time);    
        String timeStr = String.valueOf(d.intValue()) + ":00:00";    
   
        return dateStr + " " + timeStr;    
    }    
   
    /**   
     * Get the total month from two date.   
     *    
     * @param sd   
     *            the start date   
     * @param ed   
     *            the end date   
     * @return int month form the start to end date   
     * @throws ParseException   
     */   
    static public int diffDateM(Date sd, Date ed) throws ParseException {    
        return (ed.getYear() - sd.getYear()) * 12 + ed.getMonth()    
                - sd.getMonth() + 1;    
    }    
   
    static public int diffDateD(Date sd, Date ed) throws ParseException {    
        return Math.round((ed.getTime() - sd.getTime()) / 86400000) + 1;    
    }    
   
    static public int diffDateM(int sym, int eym) throws ParseException {    
        return (Math.round(eym / 100) - Math.round(sym / 100)) * 12   
                + (eym % 100 - sym % 100) + 1;    
    }    
   
    static public java.sql.Date getNextMonthFirstDate(java.sql.Date date)    
            throws ParseException {    
        Calendar scalendar = new GregorianCalendar();    
        scalendar.setTime(date);    
        scalendar.add(Calendar.MONTH, 1);    
        scalendar.set(Calendar.DATE, 1);    
        return new java.sql.Date(scalendar.getTime().getTime());    
    }    
   
    static public java.sql.Date getFrontDateByDayCount(java.sql.Date date,    
            int dayCount) throws ParseException {    
        Calendar scalendar = new GregorianCalendar();    
        scalendar.setTime(date);    
        scalendar.add(Calendar.DATE, -dayCount);    
        return new java.sql.Date(scalendar.getTime().getTime());    
    }    
   
    /**   
     * Get first day of the month.   
     *    
     * @param year   
     *            the year   
     * @param month   
     *            the month   
     * @return Date first day of the month.   
     * @throws ParseException   
     */   
    static public Date getFirstDay(String year, String month)    
            throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        return format.parse(year + "-" + month + "-1");    
    }    
   
    static public Date getFirstDay(int year, int month) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        return format.parse(year + "-" + month + "-1");    
    }    
   
    static public Date getLastDay(String year, String month)    
            throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        Date date = format.parse(year + "-" + month + "-1");    
   
        Calendar scalendar = new GregorianCalendar();    
        scalendar.setTime(date);    
        scalendar.add(Calendar.MONTH, 1);    
        scalendar.add(Calendar.DATE, -1);    
        date = scalendar.getTime();    
        return date;    
    }    
   
    static public Date getLastDay(int year, int month) throws ParseException {    
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");    
        Date date = format.parse(year + "-" + month + "-1");    
   
        Calendar scalendar = new GregorianCalendar();    
        scalendar.setTime(date);    
        scalendar.add(Calendar.MONTH, 1);    
        scalendar.add(Calendar.DATE, -1);    
        date = scalendar.getTime();    
        return date;    
    }    
   
    /**   
     * getToday get todat string with format YYYY-MM-DD from a Date object   
     *    
     * @param date   
     *            date   
     * @return String   
     */   
   
    static public String getTodayStr() throws ParseException {    
        Calendar calendar = Calendar.getInstance();    
        return getDateStr(calendar.getTime());    
    }    
   
    static public Date getToday() throws ParseException {    
        return new Date(System.currentTimeMillis());    
    }    
   
    static public String getTodayAndTime() {    
        return new Timestamp(System.currentTimeMillis()).toString();    
    }    
   
    static public String getTodayC() throws ParseException {    
        Calendar calendar = Calendar.getInstance();    
        return getDateStrC(calendar.getTime());    
    }    
   
    static public int getThisYearMonth() throws ParseException {    
        Date today = Calendar.getInstance().getTime();    
        return (today.getYear() + 1900) * 100 + today.getMonth() + 1;    
    }    
   
    static public int getYearMonth(Date date) throws ParseException {    
        return (date.getYear() + 1900) * 100 + date.getMonth() + 1;    
    }    
   
    // 获取相隔月数    
    static public long getDistinceMonth(String beforedate, String afterdate)    
            throws ParseException {    
        SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd");    
        long monthCount = 0;    
        try {    
            java.util.Date d1 = d.parse(beforedate);    
            java.util.Date d2 = d.parse(afterdate);    
   
            monthCount = (d2.getYear() - d1.getYear()) * 12 + d2.getMonth()    
                    - d1.getMonth();    
            // dayCount = (d2.getTime()-d1.getTime())/(30*24*60*60*1000);    
   
        } catch (ParseException e) {    
            System.out.println("Date parse error!");    
            // throw e;    
        }    
        return monthCount;    
    }    
   
    // 获取相隔天数    
    static public long getDistinceDay(String beforedate, String afterdate)    
            throws ParseException {    
        SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd");    
        long dayCount = 0;    
        try {    
            java.util.Date d1 = d.parse(beforedate);    
            java.util.Date d2 = d.parse(afterdate);    
   
            dayCount = (d2.getTime() - d1.getTime()) / (24 * 60 * 60 * 1000);    
   
        } catch (ParseException e) {    
            System.out.println("Date parse error!");    
            // throw e;    
        }    
        return dayCount;    
    }    
   
    // 获取相隔天数    
    static public long getDistinceDay(Date beforedate, Date afterdate)    
            throws ParseException {    
        long dayCount = 0;    
   
        try {    
            dayCount = (afterdate.getTime() - beforedate.getTime())    
                    / (24 * 60 * 60 * 1000);    
   
        } catch (Exception e) {    
            // System.out.println("Date parse error!");    
            // // throw e;    
        }    
        return dayCount;    
    }    
   
    static public long getDistinceDay(java.sql.Date beforedate,    
            java.sql.Date afterdate) throws ParseException {    
        long dayCount = 0;    
   
        try {    
            dayCount = (afterdate.getTime() - beforedate.getTime())    
                    / (24 * 60 * 60 * 1000);    
   
        } catch (Exception e) {    
            // System.out.println("Date parse error!");    
            // // throw e;    
        }    
        return dayCount;    
    }    
   
    // 获取相隔天数    
    static public long getDistinceDay(String beforedate) throws ParseException {    
        return getDistinceDay(beforedate, getTodayStr());    
    }    
   
    // 获取相隔时间数    
    static public long getDistinceTime(String beforeDateTime,    
            String afterDateTime) throws ParseException {    
        SimpleDateFormat d = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");    
        long timeCount = 0;    
        try {    
            java.util.Date d1 = d.parse(beforeDateTime);    
            java.util.Date d2 = d.parse(afterDateTime);    
   
            timeCount = (d2.getTime() - d1.getTime()) / (60 * 60 * 1000);    
   
        } catch (ParseException e) {    
            System.out.println("Date parse error!");    
            throw e;    
        }    
        return timeCount;    
    }
   
    // 获取相隔时间数    
    static public long getDistinceTime(String beforeDateTime)    
            throws ParseException {    
        return getDistinceTime(beforeDateTime, new Timestamp(System    
                .currentTimeMillis()).toLocaleString());    
    }    
    
    
    
   
}